const moment = require('moment');

/**
 * 爬虫任务
 */

module.exports = {
  schedule: {
    immediate: true,
    interval: 60 * 1000, // 每分钟
    type: 'all', // 指定 所有 worker 执行
    env: ['prod'],
  },
  async task(ctx) {
    const {model} = ctx;

    //检查有没有截图程序
    const socketsKey = Object.keys(ctx.app.io.sockets.sockets);
    if (socketsKey.length === 0)
      return;

    const vps = await model.Vps.findAll(
        {raw: true, where: {status: 4}, attributes: ['status_num']});
    const wait = {spider: 0, save: 0};
    vps.forEach(vps => {
      wait.spider += vps.status_num.spider.wait;
      wait.save += vps.status_num.save.wait;
    });

    const now = moment(), nowStr = now.format('YYYY-MM-DD HH:mm:ss');

    let status = await ctx.app.redis.get('note:spider_mission_status');
    if (status) {
      status = JSON.parse(status);
    } else
      status = {
        lastTime: 0,
        '执行时间': [],
        '更新时间': nowStr,
      };
    status['更新时间'] = now.format('YYYY-MM-DD HH:mm:ss');
    status['队列情况'] = {'爬虫': wait.spider, '保存': wait.save};

    const lastTime = moment(status.lastTime);
    //与上一次执行时间要大于3分钟
    const minutes = now.diff(lastTime, 'minutes');

    const canDo = wait.spider < 10 && wait.save < 50 && minutes >= 3;

    //不执行任务
    if (!canDo) {
      ctx.app.redis.set('note:spider_mission_status',
          JSON.stringify(status, null, 4));
      return;
    }

    status.lastTime = Date.now();
    status['执行时间'].reverse();
    status['执行时间'].splice(0, 0, nowStr);
    status['执行时间'].length = 10;
    status['执行时间'].reverse();
    ctx.app.redis.set('note:spider_mission_status',
        JSON.stringify(status, null, 4));

    const [platforms, tags] = await Promise.all([
      model.Platform.findAll(
          {raw: true, attributes: ['id', 'tag'], where: {disabled: false}}),
      model.PlatformTag.findAll({
        include: [{model: model.Platform}, {model: model.Type}],
      }),
    ]);

    //发送任务：抓取第一页列表，后续页面会自动处理
    platforms.forEach(p => {
      ctx.service.spiderTask.randomSendTask(
          {
            platform: {id: p.id, tag: p.tag},
            type: 'firstPage',
            data: null,
          });
    });

    tags.forEach(tag => {
      ctx.service.spiderTask.randomSendTask(
          {
            platform: {id: tag.platform.id, tag: tag.platform.tag},
            type: 'firstTagPage',
            data: {
              tag: {key: tag.key},
              type: {id: tag.type.id},
            },
          });
    });
  },
};